import pandas as pd
from collections import Counter
import numpy as np

def safe_index(lst, value):
    """
    返回列表中指定值的索引，如果值不在列表中则返回 -1。

    参数:
    lst (list): 需要搜索的列表。
    value: 需要在列表中查找的值。

    返回:
    int: 值在列表中的索引，或者 -1 如果值不在列表中。
    """
    if value in lst:
        return lst.index(value)+1
    else:
        return -1

# 预测规则逻辑。
def pre_fun(lst,next_expect,next_code):
    """
    执行预测的逻辑内容：
        1. 整体应该趋于平均。
        2. 某个特征如果长期没有出现过，那么他近期应该频繁的出现。确保整体概率是平均。
        3. 近期如果出现的情况下某种特征长期还没出现，那么他要出现的概率也应该会变多。
        4. 以上提到的长期情况是指在历史中连续多少期都没出现的特征情况期数的一半就算做长期啦。
    """
    # all_counter =list(lst['normalCode1'])  + list(lst['normalCode2']) + list(lst['normalCode3']) + list(lst['normalCode4']) + list(lst['normalCode5']) + list(lst['normalCode6']) + list(lst['code'])
    # counter = Counter( all_counter )
    # print(counter)
    # return -1
    total_draws = len(lst)  # 目前历史数据的期数

    # 定义长期未出现的期数
    long_term_threshold = 30  # 长期未出现的周期阈值，设定为10期
    total_numbers = 49  # 假设总共有49个数字（如1到49）

    # 获取当前历史数据中的所有号码
    all_numbers = lst[['normalCode1', 'normalCode2', 'normalCode3', 'normalCode4', 'normalCode5', 'normalCode6']].values.flatten()
    number_counts = Counter(all_numbers)
    # 获取前 24 个频率最高的元素
    top_24 = number_counts.most_common(24)
    # 将 top_24 转换为列表，只保留元素（不包括计数）
    top_24_elements = [item[0] for item in top_24]

    # 取出最近的期数来判断
    window_data = lst[max(0, total_draws - window_size):total_draws]
    window_numbers = window_data[['normalCode1', 'normalCode2', 'normalCode3', 'normalCode4', 'normalCode5', 'normalCode6']].values.flatten()
    window_counts = Counter(window_numbers)

    # 打印结果
    # print(top_24_elements)

    # 计算每个数字的出现频率
    frequency = {i: (   number_counts.get(i, 0)  )   for i in range(1, total_numbers + 1)}
    

    # 根据概率预测下一期的数字
    predicted_numbers = sorted(frequency.items(), key=lambda x: x[1], reverse=True)[:24]  # 选择前6个概率最大的数字
    # print(predicted_numbers[23][1])
    predicted_nums = [num for num, _ in predicted_numbers]
     # 打印预测结果
    if next_code == -1:
        print(f"{next_expect}期预测号码：{predicted_nums}")
        return -1
    else:
        if predicted_numbers[23][1] < 190:
            return -1
        print(f"{next_expect}期预测号码：{predicted_nums}, 中啦，号码是:{next_code},后者啥,{next_code in predicted_nums}")    
        return  0 if next_code in predicted_nums  else 1


    # 打印输出内容：
    # if next_code == -1:
        # print( f"{next_expect}期预测号码：{lst.tail(1)}")  
    # else:
        # print( f"{next_expect}期预测号码：{lst.tail(1)}, 中啦，后者啥,{next_code}")  




data = pd.read_csv('/Users/wulinghui/Downloads/macaujc2.csv')
data = data.iloc[::-1].reset_index(drop=True)  # 倒排数据
# 定义窗口大小  
window_size = 120
# 初始化用于测试的变量
test_results = []  # 存储测试结果的数据
initial_data_size = 1500  # 初始数据量
total_data = len(data)
count_total = 0
count_win = 0
# 过滤的列名.
columns_to_keep = ['expect','normalCode1', 'normalCode2', 'normalCode3', 'normalCode4', 'normalCode5', 'normalCode6', 'code']
# 开始逐次预测 ， 测试规则概率情况
for i in range(initial_data_size, total_data):
    # 截取数据
    cur_data = data[:i]
    # 下一期期数
    next_expect = int (data['expect'].iloc[i]) 
    # 下一期的开奖数：'code' 
    next_code = int (data['code'].iloc[i])
    pre_res = pre_fun(cur_data[ columns_to_keep ],next_expect,next_code)
    if pre_res == 0:
        count_win += 1
        count_total += 1
    if pre_res == 1:
        count_total += 1

# 全部数据进行预测最新期的数字。
pre_fun(data[ columns_to_keep ],next_expect+1,-1)

print(f"总场次: { total_data - initial_data_size} ,合格率 {count_win}/{count_total} : {count_win / count_total} ")



# 示例 DataFrame
demo_data = {
    'normalCode1': [1, 2, 3],
    'normalCode2': [4, 5, 6],
    'normalCode3': [7, 8, 9],
    'normalCode4': [10, 11, 12],
    'other_column': ['a', 'b', 'c']
}

demo_df = pd.DataFrame(demo_data)
#  [1, 2, 3, 4, 5, 6, 7, 8, 9]
# print( demo_data['normalCode1'])
# print( demo_data['normalCode1'] + demo_data['normalCode2'] + demo_data['normalCode3'] )


"""
我转岗你应该知道吧。 我现在主要是算法实施，算法也在学。
龙总找我接货运也接啦， 然后现在货运出完设计，我盯不盯后续的内容？
现在让我回来搞nmg我也没说啥吧，这些应该不算我的本职工作内容定位啦吧，我也不是明确的nmg负责人啦吧。

"""
